package weixin

import (
	"bytes"
	"encoding/json"
	"errors"
	"io"
	"net/http"
	"strings"
)

type QRCodeGetReq struct {
	Scene      string `json:"scene"`
	Page       string `json:"page"`
	EnvVersion string `json:"env_version"` // 要打开的小程序版本。正式版为 "release"，体验版为 "trial"，开发版为 "develop"。默认是正式版。
	Width      uint   `json:"width"`       // 默认430，二维码的宽度，单位 px，最小 280px，最大 1280px
	IsHyaline  bool   `json:"is_hyaline"`  // 默认是false，是否需要透明底色，为 true 时，生成透明底色的小程序
	CheckPath  bool   `json:"check_path"`  // 默认是true，检查page 是否存在，为 true 时 page 必须是已经发布的小程序存在的页面（否则报错）；为 false 时允许小程序未发布或者 page 不存在， 但page 有数量上限（60000个）请勿滥用。
}

func (QR *QRCodeGetReq) QRCodeGet() ([]byte, error) {
	var access_token, err = AccessTokenGet()
	if err != nil {
		return []byte{}, err
	}

	jsonValue, err := json.Marshal(QR)
	if err != nil {
		return []byte{}, err
	}

	// 将JSON数据写入请求的body中
	requestBody := bytes.NewBuffer(jsonValue)

	// 创建请求
	request, err := http.NewRequest("POST", "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token, requestBody)
	if err != nil {
		return []byte{}, err
	}

	// 设置Header
	request.Header.Set("Content-Type", "application/json")

	// 执行请求
	client := &http.Client{}
	response, err := client.Do(request)
	if err != nil {
		return []byte{}, err
	}

	defer response.Body.Close()

	var contentType = response.Header.Get("Content-Type")

	// 读取响应
	body, err := io.ReadAll(response.Body)
	if err != nil {
		return []byte{}, err
	}

	// 处理错误
	if response.StatusCode != 200 {
		return []byte{}, errors.New(string(body))
	}

	if strings.Contains(contentType, "application/json") {
		return []byte{}, errors.New(string(body))
	}

	return body, nil
}
